package cn.nawang.ebeim.client.util;

import java.io.BufferedInputStream;
import java.io.UnsupportedEncodingException;

import cn.nawang.ebeim.client.exception.RootException;

/**
 * @ClassName: IOUtil
 * @Description: TODO
 * @author fanyb
 * @date Aug 20, 2015 4:56:18 PM
 * @version v1.0
 */
public final class IOUtil {

  /**
   * 
   * @author fanyb
   * @Description: 读取指定字节 如果没有设置超时时间，那么将一直读取，知道读取字节数到达指定字节
   * @param input
   * @param count
   * @return
   * @throws RootException
   * byte[] 
   * @date Aug 20, 20155:06:11 PM
   *
   * @修改人 
   * @修改日期
   */
  public final static byte[] readBytes(final BufferedInputStream input, final int count)
      throws RootException {
    // 要读取的字节数必须大于等于1
    if (count < 1) {
      throw new RootException("期待读取的字节数必须大于0");
    }
    // 输入流不校验 直接使用
    try {
      int readCount = 0;
      int totalReadCount = 0;
      byte[] buff = new byte[count];
      // 没有读到规定大小一直读取
      while (totalReadCount < count) {
        readCount = input.read(buff, totalReadCount, (count - totalReadCount));
        // 如果错误直接结束 等待后面校验
        if (readCount == -1) {
          break;
        } else {
          totalReadCount = totalReadCount + readCount;
        }
      }
      // 校验读取情况
      // 如果已经读到了指定的字节数
      if (totalReadCount == count) {
        return buff;
      }
      buff = null;
      // 直接抛出异常
      throw new RootException("未读到预期的字节数");
    } catch (Throwable e) {
      // 不关闭流 调用者不要自己处理
      throw new RootException(e);
    }
  }

  /**
   * 
   * @author fanyb
   * @Description: 读取指定字节 并转换为指定字符集的字符串
   * @param input 输入流
   * @param count 期待读取的字节数
   * @param charset 字符集
   * @return
   * @throws NWException String
   * @date Aug 20, 20155:00:58 PM
   *
   * @修改人
   * @修改日期
   */
  public final static String readBytes2String(final BufferedInputStream input, final int count,
      String charset) throws RootException {
    byte[] buff = readBytes(input, count);
    try {
      return new String(buff, charset);
    } catch (UnsupportedEncodingException e) {
      throw new RootException("字符集转换错误", e);
    }
  }

  /**
   * 
   * @author fanyb
   * @Description: 读取指定字节 并转换为UTF8的字符串
   * @param input 输入流
   * @param count 期待读取的字节数
   * @return String
   * @throws RootException
   * @date Aug 20, 20154:59:00 PM
   *
   * @修改人
   * @修改日期
   */
  public final static String readBytes2String(final BufferedInputStream input, final int count)
      throws RootException {
    return readBytes2String(input, count, "UTF-8");
  }
}
